package br.edu.ufcg.unknown.semantico.arvore;

import br.edu.ufcg.unknown.lexico.Token;
import br.edu.ufcg.unknown.semantico.Atributo;
import br.edu.ufcg.unknown.semantico.Tipo;

public class Nodo {
	
	private Tipo tipo;
	
	public Nodo dir;
	
	public Nodo esq;

	@Deprecated
	public boolean ehFolha;

	private String conteudo;
	
	public Nodo (Token tk){
		this(tk,false);
	}
	
	public Nodo(Atributo a){
		this.tipo = a.getTipo();
		this.conteudo = a.getNome();
	}
	
	public Nodo (Token tk,boolean folha){
		this.tipo = new Tipo(tk);
		this.ehFolha = folha;
		this.conteudo = tk.getLexema();
	}
	
	public Nodo (Tipo tipo,boolean folha){
		this.tipo = tipo;
		this.ehFolha = folha;
	}

	public Tipo getTipo() {
		return tipo;
	}

	public void setTipo(Tipo tipo) {
		this.tipo = tipo;
	}

	public Nodo getFilhoDireita() {
		return dir;
	}

	public void setFilhoDireita(Nodo filhoDireita) {
		this.dir = filhoDireita;
	}

	public Nodo getFilhoEsquerda() {
		return esq;
	}

	public void setFilhoEsquerda(Nodo filhoEsquerda) {
		this.esq = filhoEsquerda;
	}

	public boolean ehFolha() {
//		return this.ehFolha;
		return this.dir == null && this.esq == null;
	}

	public boolean equals(Object obj) {

		Nodo nodo = (Nodo) obj;

		if(nodo == null){
			return false;
		}
		
		if (this.tipo != null && nodo.tipo != null) {
			if (!this.tipo.equals(nodo.tipo)) {
				return false;
			}
		} else if (this.tipo != null || nodo.tipo != null) {
			return false;
		}

		if (this.esq != null && nodo.esq != null) {
			if (!this.esq.equals(nodo.esq)) {
				return false;
			}
		} else if (this.esq != null || nodo.esq != null) {
			return false;
		}

		if (this.dir != null && nodo.dir != null) {
			if (!this.dir.equals(nodo.dir)) {
				return false;
			}
		} else if (this.dir != null || nodo.dir != null) {
			return false;
		}

		return true;

	}
	public String toString(){
		StringBuilder sb = new StringBuilder();
		
		sb.append("(");
		sb.append(this.tipo.getToken().getLexema());
		if(this.esq != null || this.dir != null){
			sb.append(",");
			if(this.esq != null){
				sb.append(this.esq);
			} else {
				sb.append("()");
			}
			
			if(this.dir != null){
				sb.append(this.dir);
			} else {
				sb.append("()");
			}
		}
		sb.append(")");
		
		return sb.toString();
	}

	public void setConteudo(String t) {
		this.conteudo = t;
		
	}

	public String getConteudo() {
		return this.conteudo;
	}

}
